package com.cskaoyan.javase._1extends._10final._3variable._3static.notice;

/**
 * 访问类的静态成员是一种类加载的时机,会触发类加载/类初始化
 * 类中的静态代码块会执行
 *
 * 但是访问类的全局常量,虽然全局常量也是static修饰的,
 *      但某些场景下,不会触发类初始化,静态代码块不执行
 *
 * 这些场景指的是:
 *      访问类的 使用字面值常量赋值的全局常量 ,不会触发类初始化
 *      原因:
 *      这些字面值常量赋值的全局常量,就相当于给字面值起名字,编译器会做特殊处理,把它们直接放入常量池
 *      访问时,不需要进行类加载,因为它们本身和类也没有关系.
 *      这是类加载的一种机制,为了提升的效率而诞生的
 *
 *
 * 但是全局常量一旦不是用字面值赋值,那些用new对象的方式赋值的引用数据类型全局常量,一样会触发类初始化.
 *
 * @since 15:16
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // System.out.println(A.num);
        /*System.out.println(A.NUM);
        System.out.println(A.NUM2);
        System.out.println(A.NUM3);
        System.out.println(A.NUM4);
        System.out.println(A.STR);*/
        System.out.println(A.STR2);
    }
}

class A {
    static {
        System.out.println("A类初始化了!");
    }

    static int num = 100;
    // 这个NUM相当于给字面值100取了个名字,本质上就是100
    static final int NUM = 100;
    static final double NUM2 = 100;
    static final char NUM3 = 'a';
    static final boolean NUM4 = true;
    static final String STR = "hello";

    static final String STR2 = new String("hello");
}
